package com.funtl.framework.java.common.util.bean;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import com.funtl.framework.java.exception.UtilException;

/**
 * 通用日期工具
 * @author lwm
 *
 */
public class DateUtil {
	public static final int SECOND = 0;
	public static final int MINUTE = 1;
	public static final int HOUR = 2;
	public static final int DAY = 3;
	
	/**
	 * 获取当前日期时间
	 * @return
	 */
	public static String getCurrentDate() {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return format.format(new Date());
	}
	
	/**
	 * 获取当前自定义格式日期
	 * @return
	 */
	public static String getCurrentDate(String formatter) {
		SimpleDateFormat format = new SimpleDateFormat(formatter);
		return format.format(new Date());
	}
	
	/**
	 * 根据某个时间点获取相差分钟级的时间点
	 * @param pointTime 已知的时间点
	 * @param time 相差的时间（以分钟为单位）
	 * @return
	 * @throws UtilException
	 */
	@SuppressWarnings("static-access")
	public static String getPointDateForMinute(String pointTime, int time) throws UtilException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String setlDate = null;
		Calendar calendar = Calendar.getInstance();
		try {
			calendar.setTime(sdf.parse(pointTime));
			calendar.add(calendar.MINUTE, time);
			setlDate = sdf.format(calendar.getTime());
			return setlDate;
		} catch (ParseException e) {
			throw new UtilException("getPointDate", e);
		}
	}
	
	/**
	 * 根据某个时间点获取相差秒级的时间点
	 * @param pointTime 已知的时间点
	 * @param time 相差的时间（以秒为单位）
	 * @return
	 * @throws UtilException
	 */
	@SuppressWarnings("static-access")
	public static String getPointDateForSecond(String pointTime, int time) throws UtilException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String setlDate = null;
		Calendar calendar = Calendar.getInstance();
		try {
			calendar.setTime(sdf.parse(pointTime));
			calendar.add(calendar.SECOND, time);
			setlDate = sdf.format(calendar.getTime());
			return setlDate;
		} catch (ParseException e) {
			throw new UtilException("getPointDate", e);
		}
	}
	
	/**
	 * 获取时间的相差数
	 * @param begintime
	 * @param endtime
	 * @param type 类型常量
	 * 0 - 分钟
	 * 1 - 小时
	 * 2 - 天
	 * @return
	 * @throws UtilException
	 */
	public static int getDifferenceTime(String begintime, String endtime, int type) throws UtilException {
		try {
			SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			long startT = inputFormat.parse(begintime).getTime();
			long endT = inputFormat.parse(endtime).getTime();
			
			long secd = (endT - startT) / (1000); // 共计秒数
			int mint = (int) secd / 60; // 共计分钟数
			int hor = (int) secd / 3600; // 共计小时数
			int day = (int) hor / 24; // 共计天数
			
			switch (type) {
			case 0:
				return (int) secd;
			case 1:
				return mint;
			case 2:
				return hor;
			case 3:
				return day;
			default:
				return 0;
			}
		} catch (ParseException e) {
			throw new UtilException("getDifferenceTime", e);
		}
	}
	
	/**
	 * 日期比较 
	 * @param date1
	 * @param date2
	 * 0 - date1 = date2 等于
	 * 1 - date1 > date2 大于
	 * -1 - date1 < date2 小于
	 * @return
	 */
	public static int getCompare(String date1, String date2) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			Date d1 = format.parse(date1);
			Date d2 = format.parse(date2);
			int result = d1.compareTo(d2);
			return result;
		} catch (ParseException e) {
			throw new UtilException("getPointDate", e);
		}
	}
	
	/**
	 * 从一个样式转换到另一个样式
	 * @param date 字符串日期形式
	 * @param style1 需要转换的样式 如：yyyy-MM-dd HH:mm:ss
	 * @param style2 当前样式 如：yyMMddHHmmss
	 * @return
	 */
	public static String formatDate(String date, String style1, String style2) {
		try {
			SimpleDateFormat format1 = new SimpleDateFormat(style1);
			SimpleDateFormat format2 = new SimpleDateFormat(style2);
			return format1.format(format2.parse(date));
		} catch (ParseException e) {
			throw new UtilException("formatDate", e);
		}
	}
}
